package com.zhuhai.repository;

import com.zhuhai.entity.Passenger;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;

import java.math.BigDecimal;
import java.util.List;

/**
 * 旅客DAO.
 *
 *  @author zhuhai
 *  @version 1.0.0.0
 */
public interface PassengerReposity extends JpaRepository<Passenger, Integer>, JpaSpecificationExecutor<Passenger> {
    /**
     * 使用简单查询通过旅客姓名（模糊匹配）和证件号（全等）查询旅客信息，需支持分页，并且根据创建时间倒叙排序。
     * @param name 旅客姓名  StartingWith('?%')   EndingWith('%?') Containing(%?%)
     * @param cardNum 证件号
     * @param pageable 分页信息
     * @return 结果
     */
    Page<Passenger> findByNameContainingAndCardNumOrderByCreateTimeDesc(final String name, final String cardNum, final Pageable pageable);
    /**
     * 使用简单查询通过旅客姓名（模糊匹配）和证件号（全等）查询旅客信息，需支持分页，并且根据创建时间倒叙排序。
     * @param name 旅客姓名  StartingWith('?%')   EndingWith('%?') Containing(%?%)
     * @return 结果
     */
    List<Passenger> findByName(final String name);
    /**
     * 使用简单查询通过旅客姓名（模糊匹配）和证件号（全等）查询旅客信息，需支持分页，并且根据创建时间倒叙排序。
     * @param name 旅客姓名
     * @param pageable 分页信息
     * @return 结果
     */
    Page<Passenger> findByNameLikeOrderByCreateTimeDesc(final String name, final Pageable pageable);
    /**
     * 使用简单查询通过旅客姓名（模糊匹配）和证件号（全等）查询旅客信息，需支持分页，并且根据创建时间倒叙排序。
     * @param cardNum 证件号
     * @param pageable 分页信息
     * @return 结果
     */
    Page<Passenger> findByCardNumOrderByCreateTimeDesc(final String cardNum, final Pageable pageable);

    /**
     * 使用@Query注解及jpql语句查询出客票低于500的旅客记录，要求使用“countQuery”,返回Page对象，同时使用Sort排序方式根据旅客年龄升序排序。
     * @param price 金额
     * @param pageable 分頁參數
     * @return 结果
     */
    @Query(value = "select p from Passenger p, TicketInfo t where p.id = t.passenger and t.price < ?1 ",
            countQuery = "SELECT count(1) from Passenger p, TicketInfo t where p.id = t.passenger")
    Page<Passenger> getPassengerListByPriceLessThanEqual(final BigDecimal price, final Pageable pageable);
}
